﻿using System;
using System.Collections.Generic;
using ClickLand.CorporacionPlaza.Comunes.Entidades;

namespace ClickLand.CorporacionPlaza.LogicaNegocio.Contratos
{
    /// <summary> Contrato para las operaciones logica en la aplicacion </summary>
    public interface ILogicaCorporacionPlaza
    {
        /// <summary> Metodo que realiza la prueba de la aplicacion </summary>
        /// <returns>true si es valido false sino</returns>
        bool Prueba();


        /// <summary> Metodo que almacena los datos de un cliente </summary>
        /// <param name="cliente">datos del cliente a almacenar</param>
        /// <returns>true si la transaccion fue exitosa false sino</returns>
        bool AgregarEditarCliente(Cliente cliente);

        
        /// <summary> Metodo que consulta los clientes dados los parametros indicados </summary>
        /// <param name="parametros">datos para la consulta</param>
        /// <returns>lista de cliente</returns>
        List<Cliente> ConsultarCliente(Cliente parametros);


        /// <summary> Metodo que almacena en base de datos la informacion del establecimiento. </summary>
        /// <param name="establecimiento">Variable donde esta contenida la informacion del establecimiento</param>
        /// <returns>retorna true si agrego, false caso contrario</returns>
        bool AgregarEditarEstablecimiento(Establecimiento establecimiento);


        /// <summary> Metodo que Consulta los establecimientos </summary>
        /// <param name="establecimiento">Parametros para la busqueda </param>
        /// <returns>Lista de todos los establecimientos</returns>
        List<Establecimiento> ConsultarTodosEstablecimientos(Establecimiento establecimiento);


        /// <summary> Metodo que agrega o modifica los datos de un contrato </summary>
        /// <param name="contrato"> datos del contrato a insertar o modificar</param>
        /// <returns>true si realizo la insercion/Modificacion </returns>
        bool AgregarEditarContrato(Contrato contrato);


        /// <summary> Metodo que consulta los datos de un contrato </summary>
        /// <param name="entidad">Parametros para la busqueda</param>
        /// <returns>Lista de contratos</returns>
        IList<Contrato> ConsultarContrato(Contrato entidad);


        /// <summary> Metodo que consulta un contato por su id </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        Contrato ConsultarContrato(long id);


        /// <summary> Metodo que envia los correos de los contratos que estan por vencerce </summary>
        void EnviarCorreos();


        /// <summary> Metodo que consulta todos los establecimientos libres dentro de un limite de fecha </summary>
        /// <param name="inicio"> </param>
        /// <param name="fechaInicio">fecha de inicio de la busqueda</param>
        /// <returns>Lista de establecimientos que concuerdan con la fecha</returns>
        IList<Establecimiento> ConsultarEstablecimientosLibres(DateTime inicio, DateTime fin);


        /// <summary> Metodo que Agrega la Venta de un contrato </summary>
        /// <param name="venta">Datos Para la insercion</param>
        /// <returns>true si realizo la insercion</returns>
        bool AgregarEditarVenta(Venta venta);


        /// <summary> Metodo que Consulta la lista de Venta de un contrato </summary>
        /// <param name="contrato">Datos Para la consulta</param>
        /// <param name="fechaInicio"> </param>
        /// <param name="fechaFin"> </param>
        /// <returns>Lista de Ventas del contrato</returns>
        List<Venta> ConsultarVentasContratos(Contrato contrato, DateTime fechaInicio, DateTime fechaFin);


        /// <summary> Metood que consulta la lista de poliza segun los parametros indicados </summary>
        /// <param name="contrato">Parametros para la busqueda</param>
        /// <returns>Lista de Poliza</returns>
        List<Poliza> ConsultarListaPoliza(Contrato contrato);


        /// <summary> Metodo que agrega o edita la proyeccion de un contrato </summary>
        /// <param name="listaNueva">Lista Nueva</param>
        /// <param name="listaVieja">Lista Vieja</param>
        /// <returns>true si realiza la operacion</returns>
        bool AgregarEditarProyeccion(IList<Proyeccion> listaNueva, IList<Proyeccion> listaVieja);


        /// <summary> Metodo que obtiene la lista deproyeccion de un contrato </summary>
        /// <param name="contrato">datos para la conuslta</param>
        /// <returns>lista de proyeccion de un contrato</returns>
        IList<Proyeccion> ConsultarProyeccion(Contrato contrato);


        /// <summary> Metodo que consulta los canon por contrato y por fecha </summary>
        /// <param name="contrato">Datos del contrato a consultar</param>
        /// <param name="fecha">fecha inicio de la consulta</param>
        /// <returns>Lista de canon</returns>
        List<ContratoPension> ConsultarCanon(Contrato contrato, DateTime fecha);


        /// <summary> Metodo que Actualiza los estados de aquellas entidades que poseen vecimiento dada su fecha </summary>
        void ActualizarEstados();
    }
}
